# ColumnParameterizedSQL.java

    package org.codefilarete.stalactite.sql.statement;

    import java.util.Map;

    import org.codefilarete.stalactite.sql.ddl.structure.Column;
    import org.codefilarete.stalactite.sql.ddl.structure.Table;
    import org.codefilarete.stalactite.sql.statement.binder.PreparedStatementWriter;
    import org.codefilarete.stalactite.sql.statement.binder.PreparedStatementWriterIndex;

    /**
     * Equivalent to {@link PreparedSQL} but with Column as index identifier.
     *
     * @author Guillaume Mary
     */
    public class ColumnParameterizedSQL<T extends Table<T>> extends ExpandableStatement<Column<T, ?>> {

    	private final Map<Column<T, ?>, int[]> columnIndexes;

    	/**
    	 * Detailed constructor
    	 *
    	 * @param sql any SQL statement with placeholder marks ('?')
    	 * @param columnIndexes mapping between {@link Column}s (used on {@link #setValue(Object, Object)} and their indexes in the SQL statement
    	 * @param parameterBinders mapping between {@link Column}s and their
    	 */
    	public ColumnParameterizedSQL(String sql, Map<? extends Column<T, ?>, int[]> columnIndexes, Map<? extends Column<T, ?>, ? extends PreparedStatementWriter<?>> parameterBinders) {
    		super(sql, parameterBinders);
    		this.columnIndexes = (Map<Column<T, ?>, int[]>) columnIndexes;
    	}

    	public ColumnParameterizedSQL(String sql, Map<? extends Column<T, ?>, int[]> columnIndexes, PreparedStatementWriterIndex<? extends Column<T, ?>, ? extends PreparedStatementWriter<?>> parameterBinderProvider) {
    		super(sql, parameterBinderProvider);
    		this.columnIndexes = (Map<Column<T, ?>, int[]>) columnIndexes;
    	}

    	/**
    	 * Gives available columns in the statement and their positions in it as placeholder marks
    	 * @return available columns in the statement and their positions in it as placeholder marks
    	 */
    	public Map<Column<T, ?>, int[]> getColumnIndexes() {
    		return columnIndexes;
    	}

    	@Override
    	protected String getParameterName(Column<T, ?> column) {
    		return column.getAbsoluteName();
    	}

    	@Override
    	public int[] getIndexes(Column<T, ?> column) {
    		return columnIndexes.get(column);
    	}
    }